/*
@title: Nomis
@description: Nomis is a retro-style, Simon-like memory game created by Cheru Berhanu, where players must recall and replicate sequences of colors to progress. As the game moves forward, the sequence of colors becomes longer and more challenging, testing the player's memory and attention. The object of the game is to achieve the highest score by correctly repeating as many sequences as possible before making a mistake.
@author: Cheru Berhanu
@tags: ['retro']
@addedOn: 2022-08-29
*/

const green = "a";
const greenRed = "b"
const greennoRed = "c"
const nogreenRed = "d"
const red = "e";
const redBlue = "f"
const rednoBlue = "g"
const noredBlue = "h"
const blue = "i";
const blueYellow = "j"
const bluenoYellow = "k"
const noblueYellow = "l"
const yellow = "m";
const yellowGreen = "n"
const yellownoGreen = "o"
const noyellowGreen = "p"
const center = "q"
const centerGreen = "r"
const centerRed = "s"
const centerBlue = "t"
const centerYellow = "u"
const black = "v"


setLegend(
  [ green, bitmap`
4444444444444444
4444444444444444
4444444444444444
4444444444444444
4444444444444444
4444444444444444
4444444444444444
4444444444444444
4444444444444444
4444444444444444
4444444444444444
4444444444444444
4444444444444444
4444444444444444
4444444444444444
4444444444444444`],
  
  [ greenRed, bitmap`
4444444444444444
4444444444444443
4444444444444433
4444444444444333
4444444444443333
4444444444433333
4444444444333333
4444444443333333
4444444433333333
4444444333333333
4444443333333333
4444433333333333
4444333333333333
4443333333333333
4433333333333333
4333333333333333`],
  [ greennoRed, bitmap`
4444444444444444
444444444444444.
44444444444444..
4444444444444...
444444444444....
44444444444.....
4444444444......
444444444.......
44444444........
4444444.........
444444..........
44444...........
4444............
444.............
44..............
4...............`],
  [ nogreenRed, bitmap`
................
...............3
..............33
.............333
............3333
...........33333
..........333333
.........3333333
........33333333
.......333333333
......3333333333
.....33333333333
....333333333333
...3333333333333
..33333333333333
.333333333333333`],

  [ red, bitmap`
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333`],
  [ redBlue, bitmap`
3333333333333333
5333333333333333
5533333333333333
5553333333333333
5555333333333333
5555533333333333
5555553333333333
5555555333333333
5555555533333333
5555555553333333
5555555555333333
5555555555533333
5555555555553333
5555555555555333
5555555555555533
5555555555555553`],
  [ rednoBlue, bitmap`
3333333333333333
.333333333333333
..33333333333333
...3333333333333
....333333333333
.....33333333333
......3333333333
.......333333333
........33333333
.........3333333
..........333333
...........33333
............3333
.............333
..............33
...............3`],
  [ noredBlue, bitmap`
................
5...............
55..............
555.............
5555............
55555...........
555555..........
5555555.........
55555555........
555555555.......
5555555555......
55555555555.....
555555555555....
5555555555555...
55555555555555..
555555555555555.`],

  [ blue, bitmap`
5555555555555555
5555555555555555
5555555555555555
5555555555555555
5555555555555555
5555555555555555
5555555555555555
5555555555555555
5555555555555555
5555555555555555
5555555555555555
5555555555555555
5555555555555555
5555555555555555
5555555555555555
5555555555555555`],
  [ blueYellow, bitmap`
6666666666666665
6666666666666655
6666666666666555
6666666666665555
6666666666655555
6666666666555555
6666666665555555
6666666655555555
6666666555555555
6666665555555555
6666655555555555
6666555555555555
6665555555555555
6655555555555555
6555555555555555
5555555555555555`],
  [ bluenoYellow, bitmap`
...............5
..............55
.............555
............5555
...........55555
..........555555
.........5555555
........55555555
.......555555555
......5555555555
.....55555555555
....555555555555
...5555555555555
..55555555555555
.555555555555555
5555555555555555`],
  [ noblueYellow, bitmap`
666666666666666.
66666666666666..
6666666666666...
666666666666....
66666666666.....
6666666666......
666666666.......
66666666........
6666666.........
666666..........
66666...........
6666............
666.............
66..............
6...............
................`],

  [ yellow, bitmap`
6666666666666666
6666666666666666
6666666666666666
6666666666666666
6666666666666666
6666666666666666
6666666666666666
6666666666666666
6666666666666666
6666666666666666
6666666666666666
6666666666666666
6666666666666666
6666666666666666
6666666666666666
6666666666666666`],
  [ yellowGreen, bitmap`
6444444444444444
6644444444444444
6664444444444444
6666444444444444
6666644444444444
6666664444444444
6666666444444444
6666666644444444
6666666664444444
6666666666444444
6666666666644444
6666666666664444
6666666666666444
6666666666666644
6666666666666664
6666666666666666`],
  [ yellownoGreen, bitmap`
6...............
66..............
666.............
6666............
66666...........
666666..........
6666666.........
66666666........
666666666.......
6666666666......
66666666666.....
666666666666....
6666666666666...
66666666666666..
666666666666666.
6666666666666666`],
  [ noyellowGreen, bitmap`
.444444444444444
..44444444444444
...4444444444444
....444444444444
.....44444444444
......4444444444
.......444444444
........44444444
.........4444444
..........444444
...........44444
............4444
.............444
..............44
...............4
................`],

  [ center, bitmap`
6444444444444444
6644444444444443
6664444444444433
6666444444444333
6666644444443333
6666664444433333
6666666444333333
6666666643333333
6666666533333333
6666665553333333
6666655555333333
6666555555533333
6665555555553333
6655555555555333
6555555555555533
5555555555555553`],
  [ centerGreen, bitmap`
6...............
66.............3
666...........33
6666.........333
66666.......3333
666666.....33333
6666666...333333
66666666.3333333
6666666533333333
6666665553333333
6666655555333333
6666555555533333
6665555555553333
6655555555555333
6555555555555533
5555555555555553`],
  [ centerRed, bitmap`
6444444444444444
664444444444444.
66644444444444..
6666444444444...
666664444444....
66666644444.....
6666666444......
666666664.......
66666665........
666666555.......
6666655555......
66665555555.....
666555555555....
6655555555555...
65555555555555..
555555555555555.`],
  [ centerBlue, bitmap`
6444444444444444
6644444444444443
6664444444444433
6666444444444333
6666644444443333
6666664444433333
6666666444333333
6666666643333333
6666666.33333333
666666...3333333
66666.....333333
6666.......33333
666.........3333
66...........333
6.............33
...............3`],
  [ centerYellow, bitmap`
.444444444444444
..44444444444443
...4444444444433
....444444444333
.....44444443333
......4444433333
.......444333333
........43333333
.......533333333
......5553333333
.....55555333333
....555555533333
...5555555553333
..55555555555333
.555555555555533
5555555555555553`],
  
  [ black, bitmap`
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000`]
);

let maps = {
  default: map`
nab
mqe
jif`,
  red: map`
nac
ms.
jih`,
  blue: map`
nab
mte
l.g`,
  yellow: map`
pab
.ue
kif`,
  green: map`
o.d
mre
jif`,
  blank: map`
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........`
}

setMap(maps.default);

const colors = ["red", "blue", "yellow", "green"]

const greenTune = tune`
500: d5^500,
15500`
const redTune = tune`
500: c5^500,
15500`
const blueTune = tune`
500: b4^500,
15500`
const yellowTune = tune`
500: a4^500,
15500`

const setColor = (val) => {
  switch (val) {
    case "red":
      playTune(redTune)
      break
    case "blue":
      playTune(blueTune)
      break
    case "yellow":
      playTune(yellowTune)
      break
    case "green":
      playTune(greenTune)
      break
  }
  setMap(maps[val])
}

let sequence = []
let current = 0
let gameOver = false
let animating = false

const hitEnd = () => {
  current = 0
  sequence.push(colors[Math.floor(Math.random()*colors.length)])
  animating = true
  sequenceAnimation(0)
}

const sequenceAnimation = (i) => {
  if (i == sequence.length) return animating = false

  setColor(sequence[i])
  setTimeout(() => {
    setColor("default")
    setTimeout(() => sequenceAnimation(i + 1), 200)
  }, 500)
}

const check = val => {

  if (gameOver || animating) return
  
  if (sequence[current] == val) {
    animating = true
    setColor(val)
      setTimeout(() => {
        setColor("default")
        animating = false
      }, 200)
    current++
    if (current == sequence.length) setTimeout(() => {
        hitEnd()
      }, 500)
  } else {
    setColor("blank")
    addText("Game Over!", { y: 4 })
    addText(`Score: ${sequence.length - 1}`, {y: 6})
    gameOver = true
  }
}

onInput("w", () => {
  check("green")
});

onInput("a", () => {
  check("yellow")
});

onInput("s", () => {
  check("blue")
});

onInput("d", () => {
  check("red")
});

hitEnd()
